package cn.wenhe9.novel.service;

import cn.wenhe9.novel.domain.dto.*;
import cn.wenhe9.novel.domain.vo.*;
import cn.wenhe9.novel.result.PageResultDto;
import cn.wenhe9.novel.result.ResultResponse;

import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * 小说模块 服务类
 *
 * @author DuJinliang
 * 2022/5/18
 */
public interface BookService {

    /**
     * 小说搜索
     * @param condition 搜索条件
     * @return 搜索结果
     * */
    ResultResponse<PageResultDto<BookInfoDto>> searchBooks(BookQueryVo condition);

    /**
     * 小说点击榜查询
     * @return 小说点击排行列表
     * */
    ResultResponse<List<BookRankDto>> listVisitRankBooks();

    /**
     * 小说新书榜查询
     * @return 小说新书排行列表
     * */
    ResultResponse<List<BookRankDto>> listNewestRankBooks();

    /**
     * 小说更新榜查询
     * @return 小说更新排行列表
     * */
    ResultResponse<List<BookRankDto>> listUpdateRankBooks();

    /**
     * 小说信息查询
     * @param bookId 小说ID
     * @return 小说信息
     * */
    ResultResponse<BookInfoDto> getBookById(Long bookId);

    /**
     * 小说内容相关信息查询
     * @param chapterId 章节ID
     * @return 内容相关联的信息
     * */
    BookContentAboutDto getBookContentAbout(Long chapterId);

    /**
     * 小说最新章节相关信息查询
     * @param bookId 小说ID
     * @return 章节相关联的信息
     * */
    BookChapterAboutDto getLastChapterAbout(Long bookId);

    /**
     * 小说推荐列表查询
     * @param bookId 小说ID
     * @return 小说信息列表
     * */
    ResultResponse<List<BookInfoDto>> listRecBooks(Long bookId) throws NoSuchAlgorithmException;

    /**
     * 增加小说点击量
     * @param bookId 小说ID
     * @return 成功状态
     * */
    ResultResponse<Void> addVisitCount(Long bookId);

    /**
     * 获取上一章节ID
     * @param chapterId 章节ID
     * @return 上一章节ID
     * */
    ResultResponse<Long> getPreChapterId(Long chapterId);

    /**
     * 获取下一章节ID
     * @param chapterId 章节ID
     * @return 下一章节ID
     * */
    ResultResponse<Long> getNextChapterId(Long chapterId);

    /**
     * 小说章节列表查询
     * @param bookId 小说ID
     * @return 小说章节列表
     * */
    ResultResponse<List<BookChapterDto>> listChapters(Long bookId);

    /**
     * 小说分类列表查询
     * @param workDirection 作品方向;0-男频 1-女频
     * @return 分类列表
     * */
    ResultResponse<List<BookCategoryDto>> listCategory(Integer workDirection);

    /**
     * 发表评论
     * @param dto 评论相关 DTO
     * @return void
     * */
    ResultResponse<Void> saveComment(UserCommentVo dto);
    /**
     * 小说最新评论查询
     *
     * @param bookId 小说ID
     * @return 小说最新评论数据
     */
    ResultResponse<BookCommentDto> listNewestComments(Long bookId);

    /**
     * 删除评论
     * @param userId 评论用户ID
     * @param commentId 评论ID
     * @return void
     * */
    ResultResponse<Void> deleteComment(Long userId, Long commentId);

    /**
     * 修改评论
     * @param userId 用户ID
     * @param id 评论ID
     * @param content 修改后的评论内容
     * @return void
     * */
    ResultResponse<Void> updateComment(Long userId, Long id, String content);

    /**
     * 根据作者id分页查询小说信息
     */
    PageResultDto<BookInfoDto> listBookPageByAuthorId(Long authorId, Long page, Long limit);

    /**
     * 发布小说
     */
    void publishBook(BookPublishVo vo, Long authorId, String penName);

    /**
     * 根据小说名和作家笔名查询
     */
    Long queryByBookNameAndPenName(String bookName, String penName);

    /**
     * 根据小说id分页查询章节信息
     */
    PageResultDto<BookChapterDto> listChaptersByPage(Long page, Long limit, Long bookId);

    /**
     * 发布章节
     */
    void publishChapter(ChapterPublishVo vo, Long authorId);

    /**
     * 删除章节
     */
    void deleteChapter(Long chapterId, Long authorId);

    /**
     * 查询要更新的章节信息
     */
    BookChapterUpdateDto getChapterInfoById(Long chapterId);

    /**
     * 更新章节内容
     */
    void updateBookContent(ChapterUpdateVo vo, Long authorId);
}
